package com.bipbip.controlador;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.validation.Valid;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.bipbip.modelo.NotificacionStandard;
import com.bipbip.modelo.Usuario;
import com.bipbip.service.NotificacionesFactory;
import com.bipbip.service.NotificacionesService;
import com.bipbip.service.UsuarioService;

@Controller
@RequestMapping("/mensajes")
@SessionAttributes({ "usuario", "cabeceraDinamica", "lateralDinamico" })
public class MensajesPersonalesController {

	private static final Logger log = Logger
			.getLogger(MensajesPersonalesController.class);

	@Autowired
	private UsuarioService usuarioService;

	@Autowired
	private NotificacionesService notificacionesService;

	@RequestMapping(value = "", method = RequestMethod.GET)
	public String verMensajes(Model model, Usuario usuario) {
		model.addAttribute("usuario", usuario);
		List<NotificacionStandard> nots = notificacionesService
				.getNotificacionesDelUsuario(usuario);
		List<Usuario> conv = new ArrayList<Usuario>();
		for (NotificacionStandard n : nots) {
			if (n.getTipo() == NotificacionStandard.MENSAJE) {
				Usuario u = usuarioService.getUsuarioById(n.getEmisor());
				if (!conv.contains(u)) {
					conv.add(u);
				}
			}
		}
		model.addAttribute("conversaciones", conv);
		return "mensajes";
	}

	@RequestMapping(value = "/{idUsuario}", method = RequestMethod.GET)
	public String conversacion(Model model, @PathVariable Integer idUsuario,
			Usuario usuario) {
		model.addAttribute("user", usuario);
		model.addAttribute("otro", usuarioService.getUsuarioById(idUsuario));
		model.addAttribute("notificacion", new NotificacionStandard());
		
		List<NotificacionStandard> nots = notificacionesService
				.getNotificacionesDelUsuario(usuario);
		List<NotificacionStandard> mjs = new ArrayList<NotificacionStandard>();
		for (NotificacionStandard n : nots) {
			if (n.getTipo() == NotificacionStandard.MENSAJE
					&& n.getEmisor() == idUsuario) {
				mjs.add(n);
			}
		}
		
		List<NotificacionStandard> notsEnv = notificacionesService
				.getNotificacionesDelUsuario(idUsuario);
		for (NotificacionStandard n : notsEnv) {
			if (n.getTipo() == NotificacionStandard.MENSAJE
					&& n.getEmisor() == usuario.getId()) {
				mjs.add(n);
			}
		}
		
		Collections.sort(mjs, new Comparator<NotificacionStandard>() {
			public int compare(NotificacionStandard o1, NotificacionStandard o2) {
				return o1.getFecha().compareTo(o2.getFecha());
			}
		});
		model.addAttribute("mensajes", mjs);
		return "conversacion";
	}

	@RequestMapping(value = "/{idUsuario}", method = RequestMethod.POST)
	public String onSubmitMensaje(Model model, @PathVariable Integer idUsuario,
			NotificacionStandard nS, Usuario u) {
		NotificacionesFactory factory = new NotificacionesFactory();
		notificacionesService.guardarNotificacion(factory
				.crearNotificacionSimple(nS.getMensaje(), u,
						usuarioService.getUsuarioById(idUsuario)));
		return "redirect:../mensajes/" + idUsuario;
	}

}
